//============================================================================================
/**
 * @file	time_anm.c
 * @brief	時間帯変更アニメーション管理
 * @author	saito GAME FREAK inc.
 * @date	2007.10.31
 */
//============================================================================================

#include "common.h"
#include "system/pm_rtc.h"
#include "g3d_anime_manager.h"
#include "time_anm.h"

#define TIME_ANM_MAX		(4)
#define ONE_MODEL_ANM_NUM_MAX	(4)	//１つのモデルに対して最大４つまでアニメが持てるとする

//時間帯ごとのアニメ参照インデックス
const static u8 TimeZoneAnmIdxTbl[] = {
	0,		//TIMEZONE_MORNING
	1,		//TIMEZONE_NOON
	2,		//TIMEZONE_EVENING
	3,		//TIMEZONE_NIGHT
	3,		//TIMEZONE_MIDNIGHT
};

typedef struct TM_ANM_DATA_tag
{
	BOOL Valid;
	int AnmNum;
	G3D_ANM_DATA_PTR AnmPtr[4];
	NNSG3dRenderObj *RenderObj;
}TM_ANM_DATA;

typedef struct TIME_ANM_MANAGER_tag{
	int NowTimeZone;
	int EntryNum;
	TM_ANM_DATA Data[TIME_ANM_MAX];
}TIME_ANM_MANAGER;

//------------------------------------------------------------------
/**
 * @brief	マネージャ初期化
 * @param	inHeapID		ヒープID
 *
 * @return	ptr				マネージャポインタ
 */
//------------------------------------------------------------------
TM_ANM_MNG_PTR TM_ANM_Init(const int inHeapID)
{
	TM_ANM_MNG_PTR ptr;
	//メモリ確保
	ptr = sys_AllocMemory(inHeapID, sizeof(TIME_ANM_MANAGER));
	//メモリクリア
	MI_CpuClearFast( ptr, sizeof(TIME_ANM_MANAGER) );
	//時間帯設定
	ptr->NowTimeZone = GF_RTC_GetTimeZone();

	return ptr;
}

//------------------------------------------------------------------
/**
 * @brief	マネージャ解放
 *
 * @param	ptr		マネージャポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
void TM_ANM_End(TM_ANM_MNG_PTR ptr)
{
	//メモリ解放
	sys_FreeMemoryEz(ptr);
}

//------------------------------------------------------------------
/**
 * @brief	時間変更アニメエントリー
 * @param	ptr			マネージャポインタ
 * @param	obj			レンダーOBJ
 * @param	AnmPtr		アニメポインタ
 * @param	inAnmNum	アニメ数
 *
 * @return	none
 */
//------------------------------------------------------------------
void TM_ANM_Entry(TM_ANM_MNG_PTR ptr, NNSG3dRenderObj *obj, G3D_ANM_DATA_PTR *AnmPtr, const int inAnmNum)
{
	if (ptr->EntryNum < TIME_ANM_MAX){
		u8 i;
		TM_ANM_DATA *data;
		GF_ASSERT( ptr->Data[ptr->EntryNum].Valid == FALSE );
		GF_ASSERT( inAnmNum <= ONE_MODEL_ANM_NUM_MAX );
		data =  &(ptr->Data[ptr->EntryNum]);
		data->Valid = TRUE;
		data->AnmNum = inAnmNum;
		if (data->AnmNum > ONE_MODEL_ANM_NUM_MAX){
			data->AnmNum = ONE_MODEL_ANM_NUM_MAX;
		}
		for(i=0;i<data->AnmNum;i++){
			data->AnmPtr[i] = AnmPtr[i];
		}
		data->RenderObj = obj;

		ptr->EntryNum++;
	}else{
		GF_ASSERT(0);
	}
}

//------------------------------------------------------------------
/**
 * @brief	時間変更アニメメイン
 * @param	ptr		マネージャポインタ
 *
 * @return	none
 */
//------------------------------------------------------------------
void TM_ANM_Main(TM_ANM_MNG_PTR ptr)
{
	int i;
	u8 time_zone, old_time_zone;

	time_zone = GF_RTC_GetTimeZone();
	//更新時間かをチェック
	if (ptr->NowTimeZone != time_zone){
		old_time_zone = ptr->NowTimeZone;
		ptr->NowTimeZone = time_zone;

		//更新
		for(i=0;i<TIME_ANM_MAX;i++){
			if (ptr->Data[i].Valid){
				TM_ANM_DATA *data = &(ptr->Data[i]);
				G3dAnimeData_Remove(data->RenderObj, data->AnmPtr[ TimeZoneAnmIdxTbl[old_time_zone] ]);
				G3dAnimeData_Add(data->RenderObj, data->AnmPtr[ TimeZoneAnmIdxTbl[time_zone] ]);
			}
		}
	}
}

//------------------------------------------------------------------
/**
 * @brief	時間帯アニメインデックス取得
 * @param	ptr			マネージャポインタ
 *
 * @return	時間帯アニメインデックス
 */
//------------------------------------------------------------------
const u8 TM_ANM_GetTimeZoneAnmIdx(TM_ANM_MNG_PTR ptr)
{
	return TimeZoneAnmIdxTbl[ptr->NowTimeZone];
}